﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OPTFleet.OPTFleet;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data;

namespace OPTFleet.Data
{
    class GestaoStock
    {
        private static String tabelaStock = "stock";
        private static String[] chavesStock = { "idstock" };
        private static String[] camposStock = { "tipoproduto", "quantidade", "datavalidade" };

        private static String tabelaProdutos = "produtos";
        private static String[] chavesProdutos = { "tipoproduto" };
        private static String[] camposProdutos = { "descricao" };

        private Conexao sqlConnection;
        public Conexao SqlConnection
        {
            set { sqlConnection = value; }
        }

        public GestaoStock()
        {
            this.sqlConnection = new Conexao();
            this.sqlConnection.connect();
        }

        public Stock ConsultarStock(int idstock)
        {
            Stock stock;
            SqlConnection sqlCon;
            SqlCommand sqlCmd;
            String[] parameters = new String[15];
            String stmtSql;
            SqlDataReader rs;

            sqlCon = (SqlConnection)sqlConnection.Connection;

            parameters[0] = tabelaStock + "." + chavesStock[0];
            parameters[1] = tabelaProdutos + "." + camposProdutos[0];
            parameters[2] = tabelaStock + "." + camposStock[1];
            parameters[3] = tabelaStock + "." + camposStock[2];
            parameters[4] = tabelaStock;
            parameters[5] = tabelaProdutos;
            parameters[6] = tabelaStock + "." + chavesStock[0];
            parameters[7] = tabelaStock + "." + camposStock[2];
            parameters[8] = tabelaStock + "." + camposStock[2];
            parameters[9] = tabelaProdutos + "." + chavesProdutos[0];
            parameters[10] = tabelaStock + "." + camposStock[0];
            
            /*
            SELECT idstock,descricao,quantidade,datavalidade 
            FROM stock,produtos 
            WHERE (stock.idstock=idstock) AND ((stock.datavalidade IS NULL) OR (stock.datavalidade >= now)) AND stock.tipoproduto = produtos.tipoproduto
            */

            stmtSql = string.Format("SELECT {0},{1},{2},{3} FROM {4},{5} WHERE ({6} = @IDStock) AND (({7} IS NULL) OR ({8} >= @Now)) AND ({9} = {10})",parameters);
            sqlCmd = new SqlCommand(stmtSql, sqlCon);

            sqlCmd.Parameters.Add("@IDStock", SqlDbType.Int);
            sqlCmd.Parameters["@IDStock"].Value = idstock;
            sqlCmd.Parameters.Add("@Now", SqlDbType.SmallDateTime);
            sqlCmd.Parameters["@Now"].Value = DateTime.Now;

            rs = sqlCmd.ExecuteReader();

            stock = MapStock(rs);

            rs.Close();

            return stock;
        }
        private Stock MapStock(DbDataReader rs)
        {
            Stock s = null;
            SqlDataReader sdr = (SqlDataReader)rs;

            if (sdr.Read())
            {
                s = new Stock();
                s.IDStock = (int)sdr[chavesStock[0]];
                //s.IDStock = sdr.GetString(0); (alternativa)
                s.Nome = ((String)sdr[camposProdutos[0]]).Trim();
                s.Quantidade = (int)sdr[camposStock[1]];
                if (!sdr.IsDBNull(3)) // campo da datade validade, no select
                    s.DataValidade = (DateTime)sdr[camposStock[2]];
                else
                    s.DataValidade = DateTime.MaxValue;
            }

            return s;
        }

        private SortedSet<String> MapStockSet(DbDataReader rs)
        {
            SqlDataReader sdr = (SqlDataReader)rs;
            SortedSet<String> ss = new SortedSet<String>();

            while(sdr.Read())
            {
                ss.Add(sdr[chavesStock[0]] + " - " + sdr[camposProdutos[0]]);
            }

            return ss;
        }

        public SortedSet<String> GetListaStocks()
        {
            SortedSet<String> ss;
            SqlConnection sqlCon;
            SqlCommand sqlCmd;
            String[] parameters = new String[10];
            String stmtSql;
            SqlDataReader rs;

            sqlCon = (SqlConnection)sqlConnection.Connection;
            
            /*
            SELECT idstock,descricao
            FROM stock,produtos
            WHERE stock.tipoproduto = produtos.tipoproduto AND ((stock.datavalidade IS NULL) OR (stock.datavalidade >= now))
            ORDER BY idstock ASC
            */
            parameters[0] = chavesStock[0];
            parameters[1] = camposProdutos[0];
            parameters[2] = tabelaStock;
            parameters[3] = tabelaProdutos;
            parameters[4] = tabelaStock + "." + camposStock[0];
            parameters[5] = tabelaProdutos + "." + chavesProdutos[0];
            parameters[6] = tabelaStock + "." + camposStock[2];
            parameters[7] = tabelaStock + "." + camposStock[2];
            parameters[8] = chavesStock[0];

            stmtSql = string.Format("SELECT {0},{1} FROM {2},{3} WHERE {4} = {5} AND (({6} IS NULL) OR ({7} >= @Now)) ORDER BY {8} ASC",parameters);

            sqlCmd = new SqlCommand(stmtSql, sqlCon);

            sqlCmd.Parameters.Add("@Now", SqlDbType.SmallDateTime);
            sqlCmd.Parameters["@Now"].Value = DateTime.Now;

            rs = sqlCmd.ExecuteReader();

            ss = MapStockSet(rs);

            rs.Close();

            return ss;
        }
    }
}
